package thread;

import java.util.Vector;

import javax.microedition.io.ConnectionNotFoundException;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;

import midlets.ConexaoWebServer;
import model.Base;
import model.BaseGasto;
import model.BasePeriodo;

import org.ksoap.SoapObject;
import org.ksoap.transport.HttpTransport;

import util.Constantes;
import util.Criptografia;
import util.Util;

import entidades.Gasto;
import entidades.Periodo;
import entidades.Usuario;


public class ThreadGetBackUpWebServer extends Thread{

	private String servicoWebService;
	private Usuario usuario;
	private CommandListener commandListener;
	
	
	
	public ThreadGetBackUpWebServer(CommandListener commandListener,
			MIDlet midlet, String servicoWebService, Usuario usuario) {

		
		if (ConexaoWebServer.display == null) {
			ConexaoWebServer.display = Display.getDisplay(midlet);
		}
		
		ConexaoWebServer.alert1 = new Alert("Conectando", "Aguarde...", null, AlertType.INFO);
		
		ConexaoWebServer.c_sair = new Command("Sair", Command.ITEM, 1);
		ConexaoWebServer.c_sim2 = new Command("Sim", Command.ITEM, 2);
		
		ConexaoWebServer.display.setCurrent(ConexaoWebServer.alert1);
		ConexaoWebServer.alert1.setTimeout(Alert.FOREVER);
		
		this.commandListener = commandListener;
		this.servicoWebService = servicoWebService;
		this.usuario = usuario;
		
	}
	
	
	
	public void run() {

		try {
			
			// chama o servico do WebService.
			SoapObject client = new SoapObject(ConexaoWebServer.URL, this.servicoWebService);
			client.addProperty("nomeUsuario", this.usuario.getNome());
			client.addProperty("senha", usuario.getSenha());
			client.addProperty("codigoacesso", new Long(usuario.getCodigoAcesso()));
			

			HttpTransport ht = new HttpTransport(ConexaoWebServer.URL,this.servicoWebService);

			String dadosEntidades = (String) ht.call(client);

				Vector colecaoDadosEntidades = Util.desformataDados(dadosEntidades);

				Vector colecaoPeriodos = null;
				Vector colecaoGastos   = null;
				boolean sucesso = false;
				
				// Limpando a memoria do servidor.
				Base.deleteRecordStore(BasePeriodo.BASE_DADOS_PERIODO);
				Base.deleteRecordStore(BaseGasto.BASE_DADOS_GASTO);
				
				switch (colecaoDadosEntidades.size()) {

				case 1:

					colecaoPeriodos = this.getColecaoPeriodosToSaveInPhone((String) colecaoDadosEntidades.elementAt(0));
					sucesso = BasePeriodo.cadastrarPeriodosResgatadosWebService(colecaoPeriodos);

					if (sucesso){ 
						ConexaoWebServer.alert1.setString(Constantes.SUCESSO_GET_BACKUP);
					}
					else{
						ConexaoWebServer.alert1.setString(Constantes.ERRO_GET_BACKUP);
					}
					
				break;
				case 2:

					colecaoPeriodos = this.getColecaoPeriodosToSaveInPhone((String) colecaoDadosEntidades.elementAt(0));
					colecaoGastos = this.getColecaoGastosToSaveInPhone((String) colecaoDadosEntidades.elementAt(1));

					sucesso = BasePeriodo.cadastrarPeriodosResgatadosWebService(colecaoPeriodos);

					if (sucesso) {

						sucesso = BaseGasto.cadastrarGastosResgatadosWebService(colecaoGastos);
						if (sucesso){
							ConexaoWebServer.alert1.setString(Constantes.SUCESSO_GET_BACKUP);
							
						}
						else{
							ConexaoWebServer.alert1.setString(Constantes.ERRO_GET_BACKUP);
						}
						
					} else {
						ConexaoWebServer.alert1.setString(Constantes.ERRO_GET_BACKUP);
					}
					
				break;
				default:
					ConexaoWebServer.alert1.setString("Erro fatal. Contate o administrador do Sistema");			
				break;
				}
				
				ConexaoWebServer.alert1.addCommand(ConexaoWebServer.c_sair);
				ConexaoWebServer.alert1.removeCommand(ConexaoWebServer.c_sim2);
				ConexaoWebServer.alert1.setCommandListener(this.commandListener);
				
		} catch(ConnectionNotFoundException e){
			
			e.printStackTrace();
			ConexaoWebServer.alert1.setString(Constantes.FALHA_CONEXAO_WEBSERVICE);

			ConexaoWebServer.alert1.addCommand(ConexaoWebServer.c_sim2);
			ConexaoWebServer.alert1.addCommand(ConexaoWebServer.c_sair);
			ConexaoWebServer.alert1.setCommandListener(this.commandListener);
			
		}
		
		catch (Exception e) {
			e.printStackTrace();
		}
		
//		System.out.println(((Gasto)(BaseGasto.findAllGastos().elementAt(0))).getNome());
	}

	
	
	
	private Vector getColecaoGastosToSaveInPhone(String dadosFormatados) {

		try {

			Criptografia c = new Criptografia();
			Vector colecaoGastos = new Vector();
			Vector colecaoDadosGastos = Util
					.desformataDadosEtidade(dadosFormatados);

			for (int j = 0; j < colecaoDadosGastos.size(); j++) {

				String entrada = (String) colecaoDadosGastos.elementAt(j);
				char[] caracteres = new char[entrada.length()];
				caracteres = entrada.toCharArray();

				String[] arrayVariaveis = new String[8];
				StringBuffer valor = new StringBuffer();

				int e = 0;
				for (int i = 0; i < caracteres.length; i++) {
					if (caracteres[i] != Constantes.SEPARADOR_VARIAVEIS)
						valor.append(caracteres[i]);
					else if (caracteres[i] == Constantes.SEPARADOR_VARIAVEIS) {
						arrayVariaveis[e] = valor.toString();
						valor = new StringBuffer();
						++e;
					}
					if (i == caracteres.length - 1)
						arrayVariaveis[e] = valor.toString();
				}

				Gasto gasto = new Gasto();

				gasto.setId(c.descriptografarInteiro(Integer
						.parseInt(arrayVariaveis[0])));
				gasto.setNome(c.descriptografarString(arrayVariaveis[1]));
				gasto.setValor(c.descriptografarDecimal(Double
						.parseDouble(arrayVariaveis[2])));
				gasto.setAno(c.descriptografarInteiro(Integer
						.parseInt(arrayVariaveis[3])));
				gasto.setMes(c.descriptografarInteiro(Integer
						.parseInt(arrayVariaveis[4])));
				gasto.setTipo(c.descriptografarInteiro(Integer
						.parseInt(arrayVariaveis[5])));
				gasto.setDescricao(c.descriptografarString(arrayVariaveis[6]));
				gasto.setDataCadastro(c
						.descriptografarString(arrayVariaveis[7]));

				colecaoGastos.addElement(gasto);
			}
			return colecaoGastos;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	
	private Vector getColecaoPeriodosToSaveInPhone(String dadosFormatados) {

		try {

			Criptografia c = new Criptografia();
			Vector colecaoPeriodos = new Vector();
			Vector colecaoDadosPeriodos = Util
					.desformataDadosEtidade(dadosFormatados);

			for (int j = 0; j < colecaoDadosPeriodos.size(); j++) {

				String entrada = (String) colecaoDadosPeriodos.elementAt(j);
				char[] caracteres = new char[entrada.length()];
				caracteres = entrada.toCharArray();

				String[] arrayVariaveis = new String[3];
				StringBuffer valor = new StringBuffer();

				int e = 0;
				for (int i = 0; i < caracteres.length; i++) {
					if (caracteres[i] != Constantes.SEPARADOR_VARIAVEIS)
						valor.append(caracteres[i]);
					else if (caracteres[i] == Constantes.SEPARADOR_VARIAVEIS) {
						arrayVariaveis[e] = valor.toString();
						valor = new StringBuffer();
						++e;
					}
					if (i == caracteres.length - 1)
						arrayVariaveis[e] = valor.toString();
				}

				Periodo periodo = new Periodo();

				periodo.setId(c.descriptografarInteiro(Integer
						.parseInt(arrayVariaveis[0])));
				periodo.setAno(c.descriptografarInteiro(Integer
						.parseInt(arrayVariaveis[1])));
				periodo.setMes(c.descriptografarInteiro(Integer
						.parseInt(arrayVariaveis[2])));

				colecaoPeriodos.addElement(periodo);
			}
			return colecaoPeriodos;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
}
